#ifndef THREAD_POOL_H
#define THREAD_POOL_H

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <pthread.h>

#include "task-queue.h"
#include "thread-factory.h"

typedef struct ThreadPool ThreadPool;

enum TimeUnit {            // 时间单位
    Second,                 // 秒
    Millisecond,            // 毫秒
    Microsecond,            // 微秒
    Nanosecond,             // 纳秒
};

enum ThreadPoolState {    // 线程池状态
    RUNNING,                // 运行态: 线程池的默认状态, 运行态能够接受新添加任务, 也能够对阻塞队列中的任务进行处理;
    SHUTDOWN,               // 关闭态: 能够对阻塞队列中的任务进行处理, 不能够接受新添加的任务;
    TERMINATED,             // 结束态: 此状态也表示整个线程池生命周期的结束;
};

enum RejectionPolicy {      // 线程池的拒绝策略
    ABORT,                  // 抛出异常
    CALLER_RUN,             // 由调用者执行任务
    BLOCKING_WAIT,          // 阻塞等待任务的提交
    DISCARD,                // 丢弃任务
    DISCARD_QUEUE_FRONT,    // 丢弃队头任务
};

ThreadPool *createThreadPool(int keep_alive_time, int core_thread_number, int max_thread_number, TaskQueue *queue,
                             ThreadFactory *factory, enum TimeUnit time_unit,
                             enum RejectionPolicy policy);                  // 创建线程池

void destroyThreadPool(ThreadPool *pool);                                   // 销毁线程池

bool submitTask(ThreadPool *pool, callback work_function, void *args);      // 向线程池提交任务

#endif //THREAD_POOL_H
